// 导入必要的包声明
package com.sky.config;

import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
import com.sky.interceptor.JwtTokenAdminInterceptor; // 自定义的JWT Token拦截器
import com.sky.interceptor.JwtTokenUserInterceptor;
import com.sky.json.JacksonObjectMapper;
import lombok.extern.slf4j.Slf4j; // Lombok日志注解
import org.springframework.beans.factory.annotation.Autowired; // Spring自动装配注解
import org.springframework.context.annotation.Bean; // Spring Bean定义注解
import org.springframework.context.annotation.Configuration; // Spring配置类注解
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.messaging.converter.MappingJackson2MessageConverter;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry; // 拦截器注册接口
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; // 资源处理器注册接口
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport; // Spring MVC配置支持类
import springfox.documentation.builders.ApiInfoBuilder; // Swagger API信息构建器
import springfox.documentation.builders.PathSelectors; // Swagger路径选择器
import springfox.documentation.builders.RequestHandlerSelectors; // Swagger请求处理器选择器
import springfox.documentation.service.ApiInfo; // Swagger API信息服务
import springfox.documentation.spi.DocumentationType; // Swagger文档类型
import springfox.documentation.spring.web.plugins.Docket; // Swagger Docket插件

import java.util.List;

/**
 * 配置类，注册web层相关组件
 */
@Configuration // 标记为Spring配置类
@Slf4j // Lombok提供的日志注解，简化日志变量的声明和使用
public class WebMvcConfiguration extends WebMvcConfigurationSupport { // 继承Spring MVC配置支持类

    @Autowired // 自动装配JwtTokenAdminInterceptor实例
    private JwtTokenAdminInterceptor jwtTokenAdminInterceptor; // 自定义的JWT Token拦截器实例

    @Autowired
    private JwtTokenUserInterceptor jwtTokenUserInterceptor;

    /**
     * 注册自定义拦截器
     *
     * @param registry 拦截器注册接口实例
     */
    protected void addInterceptors(InterceptorRegistry registry) { // 重写父类方法，注册自定义拦截器
        log.info("开始注册自定义拦截器..."); // 记录日志信息
        registry.addInterceptor(jwtTokenAdminInterceptor) // 添加自定义拦截器
                .addPathPatterns("/admin/**") // 应用到/admin/**路径下的所有请求
                .excludePathPatterns("/admin/employee/login"); // 从拦截器中排除/admin/employee/login路径

        registry.addInterceptor(jwtTokenUserInterceptor)
                .addPathPatterns("/user/**")
                .excludePathPatterns("/user/user/login")
                .excludePathPatterns("/user/shop/status");
    }

    /**
     * 通过knife4j生成接口文档
     * @return 返回Docket实例，用于生成Swagger文档
     */
    @Bean // 定义Docket Bean
    public Docket docket() { // 创建并配置Docket实例
        ApiInfo apiInfo = new ApiInfoBuilder() // 构建API信息
                .title("苍穹外卖项目接口文档") // 设置API标题
                .version("2.0") // 设置API版本
                .description("苍穹外卖项目接口文档") // 设置API描述
                .build(); // 构建ApiInfo实例
        Docket docket = new Docket(DocumentationType.SWAGGER_2) // 创建Docket实例，使用Swagger 2文档类型
                .apiInfo(apiInfo) // 设置API信息
                .select() // 开始选择哪些控制器和路径将包含在文档中
                .apis(RequestHandlerSelectors.basePackage("com.sky.controller")) // 选择指定包下的所有控制器
                .paths(PathSelectors.any()) // 选择所有路径
                .build(); // 构建Docket实例
        return docket; // 返回配置好的Docket实例
    }

    /**
     * 设置静态资源映射
     * @param registry 资源处理器注册接口实例
     */
    protected void addResourceHandlers(ResourceHandlerRegistry registry) { // 重写父类方法，设置静态资源映射
        registry.addResourceHandler("/doc.html") // 映射/doc.html到特定位置
                .addResourceLocations("classpath:/META-INF/resources/"); // 设置资源位置
        registry.addResourceHandler("/webjars/**") // 映射/webjars/**到特定位置
                .addResourceLocations("classpath:/META-INF/resources/webjars/"); // 设置资源位置
    }


}
